package com.rw.coco.api.data;

import com.rw.coco.api.data.modle.AccountModel;
import com.rw.coco.api.data.modle.BotModel;
import com.rw.coco.api.data.modle.CardModel;
import com.rw.coco.api.data.modle.CharacterModel;
import com.rw.coco.api.data.modle.CharacterPropertyModel;
import com.rw.coco.api.data.modle.DeckModel;
import com.rw.coco.api.data.modle.GroupModel;

import java.util.List;
import java.util.Set;

/**
 * 持久性数据交互
 */
public interface PersistenceMapper {
    /**
     * 获得机器人信息
     */
    BotModel getBot(long id);

    /**
     * 开启机器人
     */
    void botSwitchOn(long id);

    /**
     * 关闭机器人
     */
    void botSwitchOff(long id);

    /**
     * 让一个用户变为黑名单
     */
    void blackAccount(long id);

    /**
     * 让一个群组变为黑名单
     */
    void blackGroup(long id);

    /**
     * 关闭群组聊天
     */
    void groupSwitchOff(long id);

    /**
     * 让一个用户从黑名单变为白名单
     */
    void whiteAccount(long id);

    /**
     * 让一个群组从黑名单变为白名单
     */
    void whiteGroup(long id);

    /**
     * 开启群组聊天
     */
    void groupSwitchOn(long id);

    /**
     * 获取用户信息
     *
     * @param id 用户的ID
     */
    AccountModel getAccount(long id);

    /**
     * 获取群组信息
     *
     * @param id 群组的ID
     */
    GroupModel getGroup(long id);

    /**
     * 设置用户的开头字符
     *
     * @param id 用户的ID
     */
    void setCustomChar(long id, String customChar);

    /**
     * 变更用户的使用角色
     *
     * @param id 用户的ID
     */
    void setCharacter(long id, int characterId);

    /**
     * 获取一个用户的所有角色
     *
     * @param id 用户的ID
     */
    List<CharacterModel> getAllCharacters(long id);

    /**
     * 获取当前用户所使用的角色
     *
     * @param id 用户的ID
     */
    CharacterModel getCharacter(long id);

    /**
     * 删除用户指定的角色
     *
     * @param id          用户的ID
     * @param characterId 角色的ID
     */
    void deleteCharacter(long id, int characterId);

    /**
     * 获取当前用户当前所使用角色的所有属性
     *
     * @param id 用户的ID
     */
    Set<CharacterPropertyModel> getProperties(long id);

    /**
     * 设置某个用户当前所使用角色的属性
     *
     * @param id         用户的ID
     * @param properties 需要设置的属性
     */
    void setProperties(long id, Set<CharacterPropertyModel> properties);

    /**
     * 删除某个用户当前所使用角色的指定的某条属性
     *
     * @param id       用户的ID
     * @param property 指定的属性
     */
    void deleteProperties(long id, CharacterPropertyModel property);

    /**
     * 删除某个用户当前所使用角色的所有属性
     *
     * @param id 用户的ID
     */
    void deleteAllProperties(long id);

    /**
     * 获得所有卡堆
     *
     * @return 卡堆数组
     */
    List<DeckModel> getDecks();

    /**
     * 获得某个卡堆的卡堆信息
     *
     * @param name 卡堆的名字
     * @return 卡堆信息
     */
    DeckModel getDeck(String name);

    /**
     * 获取某个卡堆的所有卡片的信息
     *
     * @param deckName 卡堆名字
     * @return 所有卡片
     */
    List<CardModel> getAllCards(String deckName);
}
